package com.michael.leetcode;

import lombok.Data;
import org.junit.Test;

import java.util.Stack;

public class AddTwoNumbers_445 {

    @Data
    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

   /* 445. 两数相加 II
    给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
    你可以假设除了数字 0 之外，这两个数字都不会以零开头。

    示例1：
    输入：l1 = [7,2,4,3], l2 = [5,6,4]
    输出：[7,8,0,7]

    示例2：
    输入：l1 = [2,4,3], l2 = [5,6,4]
    输出：[8,0,7]

    示例3：
    输入：l1 = [0], l2 = [0]
    输出：[0]

    提示：
    链表的长度范围为 [1, 100]  0 <= node.val <= 9
    输入数据保证链表代表的数字无前导 0

    进阶：如果输入链表不能翻转该如何解决？*/
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack<ListNode> stack1 = new Stack<>();
        while (l1 != null) {
            stack1.push(l1);
            l1 = l1.next;
        }
        Stack<ListNode> stack2 = new Stack<>();
        while (l2 != null) {
            stack2.push(l2);
            l2 = l2.next;
        }
        int tmp = 0;
        ListNode tt = null;
        while (!stack1.empty() && !stack2.empty()) {
            int i = stack1.pop().val + stack2.pop().val + tmp;
            tt = new ListNode(i % 10, tt);
            tmp = i > 9 ? 1 : 0;
        }
        stack1 = stack1.empty() ? stack2 : stack1;
        while (!stack1.empty()) {
            int i = stack1.pop().val + tmp;
            tt = new ListNode(i % 10, tt);
            tmp = i > 9 ? 1 : 0;
        }
        if (tmp != 0) {
            tt = new ListNode(tmp, tt);
        }
        return tt;
    }

    @Test
    public void test(){
        ListNode node = new ListNode(3,null);
        ListNode node1 = new ListNode(4, node);
        ListNode node2 = new ListNode(2, node1);
        ListNode node3 = new ListNode(7, node2);


        ListNode nde = new ListNode(4,null);
        ListNode nde1 = new ListNode(6, nde);
        ListNode nde2 = new ListNode(5, nde1);


        ListNode listNode = addTwoNumbers(node3, nde2);
    }

}
